package com.dyx.source.bio;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;


/**
 * 阻塞I/O下的服务器实现
 *
 * 单线程逐个处理所有请求
 * 使用阻塞I/O的服务器，一般使用循环，逐个接受连接请求并读取数据，然后处理下一个请求。
 *
 * SingleThreadBIOServer使用单线程逐个处理所有请求，同一时间只能处理一个请求，等待I/O的过程浪费大量CPU资源，
 * 同时无法充分使用多CPU的优势。在MultiThreadBIOServer是使用多线程对阻塞I/O模型的改进。一个连接建立成功后，创建一个单独的线程处理其I/O操作。
 *
 */
public class SingleThreadBIOServer {

    private static final Logger LOGGER = LoggerFactory.getLogger(SingleThreadBIOServer.class);

    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        try {
//            serverSocket = new ServerSocket();
//            // 这里可以显式指定blacklog，默认的blacklog是50
//            serverSocket.bind(new InetSocketAddress(2345), 10);
            // 可以直接写成
            new ServerSocket(2345, 10);

        } catch (IOException ex) {
            LOGGER.error("Listen failed", ex);
            return;
        }
        try{
            while(true) {
//                Socket socket = serverSocket.accept();
//                System.out.println("Accept a Socket from client-->" + socket);
//                InputStream inputstream = socket.getInputStream();
//                System.out.println("Received message-->" +StreamUtils.copyToString(inputstream, Charset.defaultCharset()));
            }
        } catch(Exception ex) {
            System.err.println("Read message failed" + ex);
        }
    }
}
